home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / gnustuff / minix / libsrc~1.z / libsrc~1 / crypt.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-12-28  |  7.5 KB  |  343 lines

  1. #include "lib.h"
  2.  
  3. /*    From Andy Tanenbaum's book "Computer Networks",
  4.     rewritten in C
  5. */
  6.  
  7. struct block {
  8.     unsigned char b_data[64];
  9. };
  10.  
  11. struct ordering {
  12.     unsigned char o_data[64];
  13. };
  14.  
  15. static struct block key;
  16.  
  17. static struct ordering InitialTr = {
  18.     58,50,42,34,26,18,10, 2,60,52,44,36,28,20,12, 4,
  19.     62,54,46,38,30,22,14, 6,64,56,48,40,32,24,16, 8,
  20.     57,49,41,33,25,17, 9, 1,59,51,43,35,27,19,11, 3,
  21.     61,53,45,37,29,21,13, 5,63,55,47,39,31,23,15, 7,
  22. };
  23.  
  24. static struct ordering FinalTr = {
  25.     40, 8,48,16,56,24,64,32,39, 7,47,15,55,23,63,31,
  26.     38, 6,46,14,54,22,62,30,37, 5,45,13,53,21,61,29,
  27.     36, 4,44,12,52,20,60,28,35, 3,43,11,51,19,59,27,
  28.     34, 2,42,10,50,18,58,26,33, 1,41, 9,49,17,57,25,
  29. };
  30.  
  31. static struct ordering swap = {
  32.     33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,
  33.     49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,
  34.      1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,
  35.     17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,
  36. };
  37.  
  38. static struct ordering KeyTr1 = {
  39.     57,49,41,33,25,17, 9, 1,58,50,42,34,26,18,
  40.     10, 2,59,51,43,35,27,19,11, 3,60,52,44,36,
  41.     63,55,47,39,31,23,15, 7,62,54,46,38,30,22,
  42.     14, 6,61,53,45,37,29,21,13, 5,28,20,12, 4,
  43. };
  44.  
  45. static struct ordering KeyTr2 = {
  46.     14,17,11,24, 1, 5, 3,28,15, 6,21,10,
  47.     23,19,12, 4,26, 8,16, 7,27,20,13, 2,
  48.     41,52,31,37,47,55,30,40,51,45,33,48,
  49.     44,49,39,56,34,53,46,42,50,36,29,32,
  50. };
  51.  
  52. static struct ordering etr = {
  53.     32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9,
  54.      8, 9,10,11,12,13,12,13,14,15,16,17,
  55.     16,17,18,19,20,21,20,21,22,23,24,25,
  56.     24,25,26,27,28,29,28,29,30,31,32, 1,
  57. };
  58.  
  59. static struct ordering ptr = {
  60.     16, 7,20,21,29,12,28,17, 1,15,23,26, 5,18,31,10,
  61.      2, 8,24,14,32,27, 3, 9,19,13,30, 6,22,11, 4,25,
  62. };
  63.  
  64. static unsigned char s_boxes[8][64] = {
  65. {    14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7,
  66.      0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8,
  67.      4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0,
  68.     15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13,
  69. },
  70.  
  71. {    15, 1, 8,14, 6,11, 3, 4, 9, 7, 2,13,12, 0, 5,10,
  72.      3,13, 4, 7,15, 2, 8,14,12, 0, 1,10, 6, 9,11, 5,
  73.      0,14, 7,11,10, 4,13, 1, 5, 8,12, 6, 9, 3, 2,15,
  74.     13, 8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9,
  75. },
  76.  
  77. {    10, 0, 9,14, 6, 3,15, 5, 1,13,12, 7,11, 4, 2, 8,
  78.     13, 7, 0, 9, 3, 4, 6,10, 2, 8, 5,14,12,11,15, 1,
  79.     13, 6, 4, 9, 8,15, 3, 0,11, 1, 2,12, 5,10,14, 7,
  80.      1,10,13, 0, 6, 9, 8, 7, 4,15,14, 3,11, 5, 2,12,
  81. },
  82.  
  83. {     7,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15,
  84.     13, 8,11, 5, 6,15, 0, 3, 4, 7, 2,12, 1,10,14, 9,
  85.     10, 6, 9, 0,12,11, 7,13,15, 1, 3,14, 5, 2, 8, 4,
  86.      3,15, 0, 6,10, 1,13, 8, 9, 4, 5,11,12, 7, 2,14,
  87. },
  88.  
  89. {     2,12, 4, 1, 7,10,11, 6, 8, 5, 3,15,13, 0,14, 9,
  90.     14,11, 2,12, 4, 7,13, 1, 5, 0,15,10, 3, 9, 8, 6,
  91.      4, 2, 1,11,10,13, 7, 8,15, 9,12, 5, 6, 3, 0,14,
  92.     11, 8,12, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3,
  93. },
  94.  
  95. {    12, 1,10,15, 9, 2, 6, 8, 0,13, 3, 4,14, 7, 5,11,
  96.     10,15, 4, 2, 7,12, 9, 5, 6, 1,13,14, 0,11, 3, 8,
  97.      9,14,15, 5, 2, 8,12, 3, 7, 0, 4,10, 1,13,11, 6,
  98.      4, 3, 2,12, 9, 5,15,10,11,14, 1, 7, 6, 0, 8,13,
  99. },
  100.  
  101. {     4,11, 2,14,15, 0, 8,13, 3,12, 9, 7, 5,10, 6, 1,
  102.     13, 0,11, 7, 4, 9, 1,10,14, 3, 5,12, 2,15, 8, 6,
  103.      1, 4,11,13,12, 3, 7,14,10,15, 6, 8, 0, 5, 9, 2,
  104.      6,11,13, 8, 1, 4,10, 7, 9, 5, 0,15,14, 2, 3,12,
  105. },
  106.  
  107. {    13, 2, 8, 4, 6,15,11, 1,10, 9, 3,14, 5, 0,12, 7,
  108.      1,15,13, 8,10, 3, 7, 4,12, 5, 6,11, 0,14, 9, 2,
  109.      7,11, 4, 1, 9,12,14, 2, 0, 6,10,13,15, 3, 5, 8,
  110.      2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11,
  111. },
  112. };
  113.  
  114. static int rots[] = {
  115.     1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1,
  116. };
  117.  
  118. static void
  119. transpose(data, t, n)
  120.     register struct block *data;
  121.     register struct ordering *t;
  122.     register int n;
  123. {
  124.     struct block x;
  125.  
  126.     x = *data;
  127.  
  128.     while (n-- > 0) {
  129.         data->b_data[n] = x.b_data[t->o_data[n] - 1];
  130.     }
  131. }
  132.  
  133. static void
  134. rotate(key)
  135.     register struct block *key;
  136. {
  137.     register unsigned char *p = key->b_data;
  138.     register unsigned char *ep = &(key->b_data[55]);
  139.     int data0 = key->b_data[0], data28 = key->b_data[28];
  140.  
  141.     while (p++ < ep) *(p-1) = *p;
  142.     key->b_data[27] = data0;
  143.     key->b_data[55] = data28;
  144. }
  145.  
  146. static struct ordering *EP = &etr;
  147.  
  148. static void
  149. f(i, key, a, x)
  150. int i;
  151.     struct block *key, *a;
  152.     register struct block *x;
  153. {
  154.     struct block e, ikey, y;
  155.     int k;
  156.     register unsigned char *p, *q, *r;
  157.  
  158.     e = *a;
  159.     transpose(&e, EP, 48);
  160.     for (k = rots[i]; k; k--) rotate(key);
  161.     ikey = *key;
  162.     transpose(&ikey, &KeyTr2, 48);
  163.     p = &(y.b_data[48]);
  164.     q = &(e.b_data[48]);
  165.     r = &(ikey.b_data[48]);
  166.     while (p > y.b_data) {
  167.         *--p = *--q ^ *--r;
  168.     }
  169.     q = x->b_data;
  170.     for (k = 0; k < 8; k++) {
  171.         register int xb, r;
  172.  
  173.         r = *p++ << 5;
  174.         r += *p++ << 3;
  175.         r += *p++ << 2;
  176.         r += *p++ << 1;
  177.         r += *p++;
  178.         r += *p++ << 4;
  179.  
  180.         xb = s_boxes[k][r];
  181.  
  182.         *q++ = (xb >> 3) & 1;
  183.         *q++ = (xb>>2) & 1;
  184.         *q++ = (xb>>1) & 1;
  185.         *q++ = (xb & 1);
  186.     }
  187.     transpose(x, &ptr, 32);
  188. }
  189.  
  190. void setkey(k)
  191. _CONST register char *k;
  192. {
  193.  
  194.     key = *((struct block *) k);
  195.     transpose(&key, &KeyTr1, 56);
  196. }
  197.  
  198. void encrypt(blck, edflag)
  199.     char *blck;
  200. int edflag;
  201. {
  202.     register struct block *p = (struct block *) blck;
  203.     register int i;
  204.  
  205.     transpose(p, &InitialTr, 64);
  206.     for (i = 15; i>= 0; i--) {
  207.         int j = edflag ? i : 15 - i;
  208.         register int k;
  209.         struct block b, x;
  210.  
  211.         b = *p;
  212.         for (k = 31; k >= 0; k--) {
  213.             p->b_data[k] = b.b_data[k + 32];
  214.         }
  215.         f(j, &key, p, &x);
  216.         for (k = 31; k >= 0; k--) {
  217.             p->b_data[k+32] = b.b_data[k] ^ x.b_data[k];
  218.         }
  219.     }
  220.     transpose(p, &swap, 64);
  221.     transpose(p, &FinalTr, 64);
  222. }
  223.  
  224. char *
  225. crypt(pw,salt)
  226.     register char *pw;
  227.     _CONST char *salt;
  228. {
  229.     /*    Unfortunately, I had to look at the sources of V7 crypt.
  230.         There was no other way to find out what this routine
  231.         actually does.
  232.     */
  233.     
  234.     char pwb[66];
  235.     static char result[16];
  236.     register char *p = pwb;
  237.     struct ordering new_etr;
  238.     register int i;
  239.  
  240.     while (*pw && p < &pwb[64]) {
  241.         register int j = 7;
  242.  
  243.         while (j--) {
  244.             *p++ = (*pw >> j) & 01;
  245.         }
  246.         pw++;
  247.         *p++ = 0;
  248.     }
  249.     while (p < &pwb[64]) *p++ = 0;
  250.  
  251.     setkey(p = pwb);
  252.  
  253.     while (p < &pwb[66]) *p++ = 0;
  254.  
  255.     new_etr = etr;
  256.     EP = &new_etr;
  257.     for (i = 0; i < 2; i++) {
  258.         register char c = *salt++;
  259.         register int j;
  260.  
  261.         result[i] = c;
  262.         if ( c > 'Z') c -= 6 + 7 + '.';    /* c was a lower case letter */
  263.         else if ( c > '9') c -= 7 + '.';/* c was upper case letter */
  264.         else c -= '.';            /* c was digit, '.' or '/'. */
  265.                         /* now, 0 <= c <= 63 */
  266.         for (j = 0; j < 6; j++) {
  267.             if ((c >> j) & 01) {
  268.                 int t = 6*i + j;
  269.                 int temp = new_etr.o_data[t];
  270.                 new_etr.o_data[t] = new_etr.o_data[t+24];
  271.                 new_etr.o_data[t+24] = temp;
  272.             }
  273.         }
  274.     }
  275.  
  276.     if (result[1] == 0) result[1] = result[0];
  277.  
  278.     for (i = 0; i < 25; i++) encrypt(pwb,0);
  279.     EP = &etr;
  280.  
  281.     p = pwb;
  282.     pw = result+2;
  283.     while (p < &pwb[66]) {
  284.         register int c = 0;
  285.         register int j = 6;
  286.  
  287.         while (j--) {
  288.             c <<= 1;
  289.             c |= *p++;
  290.         }
  291.         c += '.';        /* becomes >= '.' */
  292.         if (c > '9') c += 7;    /* not in [./0-9], becomes upper */
  293.         if (c > 'Z') c += 6;    /* not in [A-Z], becomes lower */
  294.         *pw++ = c;
  295.     }
  296.     *pw = 0;
  297.     return result;
  298. }
  299.  
  300. #ifdef NEW
  301. char *crypt(pw, salt)
  302. char *pw;
  303. _CONST char *salt;
  304. {
  305.     static char buf[14];
  306.     register char bits[67];
  307.     register int i;
  308.     register int j, rot;
  309.  
  310.     for (i=0; i < 67; i++)
  311.         bits[i] = 0;
  312.     if (salt[1] == 0)
  313.         salt[1] = salt[0];
  314.     rot = (salt[1] * 4 - salt[0]) % 128;
  315.     for (i=0; *pw && i < 8; i++) {
  316.         for (j=0; j < 7; j++)
  317.             bits[i+j*8] = (*pw & (1 << j) ? 1 : 0);
  318.         bits[i+56] = (salt[i / 4] & (1 << (i % 4)) ? 1 : 0);
  319.         pw++;
  320.     }
  321.     bits[64] = (salt[0] & 1 ? 1 : 0);
  322.     bits[65] = (salt[1] & 1 ? 1 : 0);
  323.     bits[66] = (rot & 1 ? 1 : 0);
  324.     while (rot--) {
  325.         for (i=65; i >= 0; i--)
  326.             bits[i+1] = bits[i];
  327.         bits[0] = bits[66];
  328.     }
  329.     for (i=0; i < 12; i++) {
  330.         buf[i+2] = 0;
  331.         for (j=0; j < 6; j++)
  332.             buf[i+2] |= (bits[i*6+j] ? (1 << j) : 0);
  333.         buf[i+2] += 48;
  334.         if (buf[i+2] > '9') buf[i+2] += 7;
  335.         if (buf[i+2] > 'Z') buf[i+2] += 6;
  336.     }
  337.     buf[0] = salt[0];
  338.     buf[1] = salt[1];
  339.     buf[13] = '\0';
  340.     return(buf);
  341. }
  342. #endif
  343.